/**
 * Copyright: Copyright (c)2011
 * Company: 易宝支付(YeePay)
 */
package net.loyintean.pearlshell.base.model;

import java.io.Serializable;

/** @author：jun.lin@yeepay.com
 * @since：2015年4月4日 下午9:19:46
 * @version: */
public class ResultData<T> implements Serializable {

	/** serialVersionUID : */
	private static final long serialVersionUID = 8560872483353608612L;

	/** DEFAULT_SUCCESS_MESSAGE :默认的返回信息 */
	private String DEFAULT_SUCCESS_MESSAGE = "操作成功";

	/** data :操作结果的数据 */
	private T data = null;

	/** message :操作结果信息 */
	private String message = "";

	/** success :操作结果状态 */
	private boolean success = false;

	/** 初始化一个操作数据
	 * <p>
	 * 得到一个这样的数据：<br>
	 * getData()为null<br>
	 * getMessage()为null<br>
	 * isSuccess()为fale
	 * 
	 * @return */
	public static final <T> ResultData<T> INIT() {
		return new ResultData<T>();
	}

	private ResultData() {
	}

	private ResultData(T data) {
		this.data = data;
	}

	/** 获取操作数据。
	 * <p>
	 * 当操作成功时，返回操作结果。<br>
	 * 如果实际的方法返回void值，则这里获取的值为null<br>
	 * 当操作失败时，返回结果不确定。由实际的代码决定
	 * 
	 * @return 操作结果数据，结果也可能不确定 */
	public T getData() {
		return data;
	}

	/** 获取操作信息。
	 * <p>
	 * 
	 * @return 操作信息。当操作成功时，返回 {@link #DEFAULT_SUCCESS_MESSAGE}的值 */
	public String getMessage() {
		return message;
	}

	/** 判断操作结果是否为成功
	 * 
	 * @return 如果返回true，则说明操作成功，可以从 {@link #getData()}获取数据<br>
	 *         否则操作失败，可以从 {@link #getMessage()}中获取失败信息 */
	public boolean isSuccess() {
		return success;
	}

	/** 声明本次操作成功
	 * <p>
	 * 执行此操作后：<br>
	 * {@link #getData()}方法将获取null<br>
	 * {@link #getMessage()}将返回 {@link #DEFAULT_SUCCESS_MESSAGE}<br>
	 * {@link #isSuccess()}将返回true
	 * 
	 * @param data
	 *            成功操作所得到的数据 */
	public void success(T data) {
		this.success();
		this.data = data;
	}

	/** 声明本次操作成功
	 * <p>
	 * 执行此操作后：<br>
	 * {@link #getData()}方法将获取本方法的入参data<br>
	 * {@link #getMessage()}将返回 {@link #DEFAULT_SUCCESS_MESSAGE}<br>
	 * {@link #isSuccess()}将返回true
	 * 
	 * @param data
	 *            成功操作所得到的数据 */
	public void success() {
		this.data = null;
		this.message = DEFAULT_SUCCESS_MESSAGE;
		this.success = true;
	}

	/** 声明本次操作失败
	 * <p>
	 * 执行此操作后：<br>
	 * {@link #getData()}将返回null<br>
	 * {@link #getMessage()}将返回本方法入参message<br>
	 * {@link #isSuccess()}将返回false
	 * 
	 * @param message
	 *            操作失败的信息 */
	public void fail(String message) {
		this.data = null;
		this.message = message;
		this.success = false;
	}

	/** 声明本次操作失败，并指定一个可以用于恢复“现场”的数据
	 * <p>
	 * 执行此操作后：<br>
	 * {@link #getData()}将返回本方法的入参data<br>
	 * {@link #getMessage()}将返回本方法入参message<br>
	 * {@link #isSuccess()}将返回false
	 * 
	 * @param message
	 *            操作失败的信息
	 * @param data
	 *            用于让后续操作可以继续执行的补救数据 */
	public void fail(String message, T data) {
		this.fail(message);
		this.data = data;
	}

	/** @see java.lang.Object#toString() */
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("ResultData [");
		if (data != null) {
			builder.append("data=");
			builder.append(data);
			builder.append(", ");
		}
		if (message != null) {
			builder.append("message=");
			builder.append(message);
			builder.append(", ");
		}
		builder.append("success=");
		builder.append(success);
		builder.append("]");
		return builder.toString();
	}

}
